package cn.hinglo.gameclaw.client.service;

import cn.hinglo.gameclaw.client.dao.InvitationDao;
import cn.hinglo.gameclaw.data.entity.Result;
import cn.hinglo.gameclaw.data.utils.ResultUtils;
import cn.hinglo.gameclaw.user.bean.Invitation;
import cn.hinglo.gameclaw.user.bean.UserInfo;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;

/**
 * @createTime: 2018/1/18
 * @author: HingLo
 * @description: 邀请码处理
 */
@Service
@Slf4j
public class InvitationService {
    /**
     * 默认自己填写邀请码赠送的金币数量
     */
    public static int GOLD = 3;
    /**
     * 填写邀请码后，好友得到的钻石数量
     */
    public static int FRIEND_GOLD = 2;
    /***
     * 邀请人数上线
     */
    private static int NUMBER = 50;
    private final InvitationDao invitationDao;


    @Autowired
    public InvitationService(InvitationDao invitationDao) {
        this.invitationDao = invitationDao;
    }

    /**
     * 通过邀请码查询全部的填写了该邀请码的用户信息集合
     *
     * @param uid 用户的唯一uid/邀请码
     * @return 返回用户信息
     */
    public Result listInvitationService(String uid) {
        if (StrUtil.isNotBlank(uid)) {
            return ResultUtils.success(invitationDao.listInvitationDao(uid));
        }
        return ResultUtils.error("邀请码格式有误");
    }

    /**
     * 添加邀请码填写记录
     *
     * @param userId 用户的Id
     * @param code   邀请码
     * @return 返回添加结果
     */
    @Transactional(rollbackFor = RuntimeException.class)
    public Result addInvitationService(String userId, String code) {
        //判断userId是否填写了验证码
        UserInfo userInfo = invitationDao.findByIdUserInfoDao(userId);
        if (userInfo != null) {
            String ucode = userInfo.getFillCode();
            if (StrUtil.isBlank(ucode)) {
                //检测该邀请码是否存在
                userInfo = invitationDao.findByCodeUserInfoDao(code);
                if (userInfo == null) {
                    return ResultUtils.error("邀请码不存在");
                }
                //检测该邀请码填写是否已经超过50次
                Invitation invitation = new Invitation().setCode(code);
                List<Invitation> list = invitationDao.select(invitation);
                if (list.size() > NUMBER) {
                    return ResultUtils.error("该邀请码已经达到邀请码填写上线");
                }
                //开始插入邀请码记录
                invitation.setUserId(userId).setDate(new Date()).setGold(GOLD);
                //插入邀请码填写记录
                if (invitationDao.insert(invitation) > 0) {
                    //填写邀请码的人更新自己的金币，与填充邀请码，2：邀请码的主人更新钻石
                    if (invitationDao.updateUserInfoCodeDao(GOLD, code, userId) == 1 && invitationDao.updateUserGiveGoldDao(FRIEND_GOLD, userInfo.getUserId()) == 1) {
                        return ResultUtils.success();
                    } else {
                        throw new RuntimeException("添加邀请记录失败");
                    }
                } else {
                    throw new RuntimeException("填写邀请记录失败");
                }
            } else {
                return ResultUtils.error("你已填写过邀请码了");
            }
        }
        return ResultUtils.error("用户Id不正确");
    }


    /**
     * 用户查询自己的邀请码的填写记录
     *
     * @param userId 用户的Id
     * @return 填写记录
     */
    public List<?> listService(String userId) {
        return invitationDao.listDao(userId);
    }

    /***
     * 统计该人的邀请码被邀请后填写的钻石总量
     * @param userId 用户的Id
     * @return 钻石总量
     */
    public Integer countService(String userId) {
        return invitationDao.countDao(userId);
    }
}
